ホームに戻る
関連 :
目次 :
DLLのエントリポイント
一般的なWin32 DLLは DllMain() をエントリポイントに持つ。
(Win32アプリケーション(EXE)のエントリポイントは WinMain() 。)
DllMain() の一般形(スケルトン)は以下の通り。
BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH: // DLLがプロセスのアドレス空間にマッピングされた (LoadLibrary)
break;
case DLL_THREAD_ATTACH: // スレッドが作成されようとしている
break;
case DLL_THREAD_DETACH: // スレッドが破棄されようとしている
break;
case DLL_PROCESS_DETACH: // DLLのマッピングが解除されようとしている (FreeLibrary)
break;
}
return TRUE;
}
DLLを(動的に)リンクした場合、DllMain() は以下のタイミングでコールされる。
- DLLロード時(LoadLibrary()) : dwReason = DLL_PROCESS_ATTACH
- DLLアンロード時(FreeLibrary()) : dwReason = DLL_PROCESS_DETACH
- DLL内でスレッドを起動 : dwReason = DLL_THREAD_ATTACH
- DLL内で起動したスレッドが終了 : dwReason = DLL_THREAD_DETACH
DLL内の静的オブジェクトの生成タイミング
DLL内に静的オブジェクトが存在する場合、 DLLロード時 DllMain() のコールより前に生成され、DLLアンロード時 DllMain() のコール後に破棄される 。
以下のコードを参照。
テスト用EXE
int _tmain(int argc, _TCHAR* argv[])
{
wprintf(L"Main , entered\n");
// DLLロード
wprintf(L"Main , loading library\n");
HMODULE h = LoadLibrary(L"Test.dll");
if (h)
{
// DLLアンロード
wprintf(L"Main , freeing library\n");
FreeLibrary(h);
}
wprintf(L"Main , exiting\n");
return 0;
}
DLL
// 構造体 Moo 型
struct Moo
{
Moo() { wprintf(L"Moo , constructor\n"); } //< コンストラクタ
~Moo() { wprintf(L"Moo , destructor\n"); } //< デストラクタ
};
Moo m; //< 静的な Moo インスタンス
// DllMain() 関数
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
wprintf(L"DllMain, DLL_PROCESS_ATTACH\n");
break;
case DLL_THREAD_ATTACH:
wprintf(L"DllMain, DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
wprintf(L"DllMain, DLL_THREAD_DETACH\n");
break;
case DLL_PROCESS_DETACH:
wprintf(L"DllMain, DLL_PROCESS_DETACH\n");
break;
default:
wprintf(L"DllMain, ????\n");
break;
}
return TRUE;
}
出力結果 (解説のために改行、コメントを追加)
Main , entered
Main , loading library //< EXEからDLLをロード
Moo , constructor //< 静的 Moo インスタンス生成
DllMain, DLL_PROCESS_ATTACH //< DllMain() : dwReason = DLL_PROCESS_ATTACH
Main , freeing library //< EXEからDLLをアンロード
DllMain, DLL_PROCESS_DETACH //< DllMain() : dwReason = DLL_PROCESS_DETACH
Moo , destructor //< 静的 Moo インスタンス破棄
Main , exiting